﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace System.Web.Mvc.Html
{   
    //Todo:为Helper添加CSS样式
    public static class DisplayThroughReflectionHelper
    {
        public static string DisplayObjectArrayThroughReflection(this HtmlHelper helper, object objectArrayToDisplay, string typeName)//使用typeName来区分例如BorrowLog 1、BorrowLog 2，其中BorrowLog就是typeName
        {
            object[] objArray = (object[])objectArrayToDisplay;    //将传入的Object强制转换成Object数组
            string result = null;
            int count = 0;
            foreach(object obj in objArray)          //遍历数组里面的每一个对象
            {
                count++;       //用于记录obj对象是对应的数组里面的第几个
                result += string.Format("<p><strong>{0}{1}</strong></p>\n", typeName, count);
                Type type = obj.GetType();        //获取对戏那个的类型
                System.Reflection.PropertyInfo[] infos = type.GetProperties();          //获取对应类型的所有公共属性
                foreach (var property in infos)        //遍历所有的公共属性
                {
                    result += string.Format("<p>{0}：{1}</p>\n", property.Name, property.GetValue(obj, null));            //获取对应的obj对象的某一个公共属性的值并生成HTML语句添加到result字符串中
                }
            }
            return result;
        }

        public static string DisplayObjectThroughReflection(this HtmlHelper helper, object objectToDisplay)
        {
            string result = null;
            Type type = objectToDisplay.GetType();
            System.Reflection.PropertyInfo[] infos = type.GetProperties();
            foreach (var property in infos)
            {
                result += string.Format("<p>{0}：{1}</p>\n", property.Name, property.GetValue(objectToDisplay, null));
            }
            return result;
        }

        public static string DisplayObjectArrayThroughReflection(this HtmlHelper helper, object objectArrayToDisplay, string typeName,KeyValuePair<string,string> extraLink,string insideLinkPropertyName)//使用typeName来区分例如BorrowLog 1、BorrowLog 2，其中BorrowLog就是typeName
        //extraLink表示需要显示的额外的链接，如Edit，则KeyValuePair的索引为Edit，对应值为Edit所对应的链接，其中链接里的*PROPERTYNAME*表示需要替换为insideLinkPropertyName对应的公共属性的值的地方
        {
            object[] objArray = (object[])objectArrayToDisplay;
            string result = null;
            int count = 0;
            foreach (object obj in objArray)
            {
                Type type = obj.GetType();
                System.Reflection.PropertyInfo[] infos = type.GetProperties();
                count++;
                result += string.Format("<p><strong>{0}{1}</strong>", typeName, count);
                result += string.Format("<a href=\"{0}\">{1}</a></p>",extraLink.Value.Replace("*PROPERTYNAME*", (type.GetProperty(insideLinkPropertyName).GetValue(obj, null)).ToString()),extraLink.Key);   //替换传入的extraLink并生成相应的HTML代码添加到result字符串中，使得最后生成的页面中可以有自定义的链接
                foreach (var property in infos)
                {
                    result += string.Format("<p>{0}：{1}</p>\n", property.Name, property.GetValue(obj, null));
                }
            }
            return result;
        }
    }
}